home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / ipv6.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  11.3 KB  |  515 lines

  1. #ifndef _IPV6_H
  2. #define _IPV6_H
  3.  
  4. #include <linux/in6.h>
  5. #include <asm/byteorder.h>
  6.  
  7. /* The latest drafts declared increase in minimal mtu up to 1280. */
  8.  
  9. #define IPV6_MIN_MTU    1280
  10.  
  11. /*
  12.  *    Advanced API
  13.  *    source interface/address selection, source routing, etc...
  14.  *    *under construction*
  15.  */
  16.  
  17.  
  18. struct in6_pktinfo {
  19.     struct in6_addr    ipi6_addr;
  20.     int        ipi6_ifindex;
  21. };
  22.  
  23.  
  24. struct in6_ifreq {
  25.     struct in6_addr    ifr6_addr;
  26.     __u32        ifr6_prefixlen;
  27.     int        ifr6_ifindex; 
  28. };
  29.  
  30. #define IPV6_SRCRT_STRICT    0x01    /* Deprecated; will be removed */
  31. #define IPV6_SRCRT_TYPE_0    0    /* Deprecated; will be removed */
  32. #define IPV6_SRCRT_TYPE_2    2    /* IPv6 type 2 Routing Header    */
  33.  
  34. /*
  35.  *    routing header
  36.  */
  37. struct ipv6_rt_hdr {
  38.     __u8        nexthdr;
  39.     __u8        hdrlen;
  40.     __u8        type;
  41.     __u8        segments_left;
  42.  
  43.     /*
  44.      *    type specific data
  45.      *    variable length field
  46.      */
  47. };
  48.  
  49.  
  50. struct ipv6_opt_hdr {
  51.     __u8         nexthdr;
  52.     __u8         hdrlen;
  53.     /* 
  54.      * TLV encoded option data follows.
  55.      */
  56. } __attribute__ ((packed));    /* required for some archs */
  57.  
  58. #define ipv6_destopt_hdr ipv6_opt_hdr
  59. #define ipv6_hopopt_hdr  ipv6_opt_hdr
  60.  
  61. #ifdef __KERNEL__
  62. #define ipv6_optlen(p)  (((p)->hdrlen+1) << 3)
  63. #endif
  64.  
  65. /*
  66.  *    routing header type 0 (used in cmsghdr struct)
  67.  */
  68.  
  69. struct rt0_hdr {
  70.     struct ipv6_rt_hdr    rt_hdr;
  71.     __u32            reserved;
  72.     struct in6_addr        addr[0];
  73.  
  74. #define rt0_type        rt_hdr.type
  75. };
  76.  
  77. /*
  78.  *    routing header type 2
  79.  */
  80.  
  81. struct rt2_hdr {
  82.     struct ipv6_rt_hdr    rt_hdr;
  83.     __u32            reserved;
  84.     struct in6_addr        addr;
  85.  
  86. #define rt2_type        rt_hdr.type
  87. };
  88.  
  89. /*
  90.  *    home address option in destination options header
  91.  */
  92.  
  93. struct ipv6_destopt_hao {
  94.     __u8            type;
  95.     __u8            length;
  96.     struct in6_addr        addr;
  97. } __attribute__ ((__packed__));
  98.  
  99. /*
  100.  *    IPv6 fixed header
  101.  *
  102.  *    BEWARE, it is incorrect. The first 4 bits of flow_lbl
  103.  *    are glued to priority now, forming "class".
  104.  */
  105.  
  106. struct ipv6hdr {
  107. #if defined(__LITTLE_ENDIAN_BITFIELD)
  108.     __u8            priority:4,
  109.                 version:4;
  110. #elif defined(__BIG_ENDIAN_BITFIELD)
  111.     __u8            version:4,
  112.                 priority:4;
  113. #else
  114. #error    "Please fix <asm/byteorder.h>"
  115. #endif
  116.     __u8            flow_lbl[3];
  117.  
  118.     __be16            payload_len;
  119.     __u8            nexthdr;
  120.     __u8            hop_limit;
  121.  
  122.     struct    in6_addr    saddr;
  123.     struct    in6_addr    daddr;
  124. };
  125.  
  126. #ifdef __KERNEL__
  127. /*
  128.  * This structure contains configuration options per IPv6 link.
  129.  */
  130. struct ipv6_devconf {
  131.     __s32        forwarding;
  132.     __s32        hop_limit;
  133.     __s32        mtu6;
  134.     __s32        accept_ra;
  135.     __s32        accept_redirects;
  136.     __s32        autoconf;
  137.     __s32        dad_transmits;
  138.     __s32        rtr_solicits;
  139.     __s32        rtr_solicit_interval;
  140.     __s32        rtr_solicit_delay;
  141.     __s32        force_mld_version;
  142. #ifdef CONFIG_IPV6_PRIVACY
  143.     __s32        use_tempaddr;
  144.     __s32        temp_valid_lft;
  145.     __s32        temp_prefered_lft;
  146.     __s32        regen_max_retry;
  147.     __s32        max_desync_factor;
  148. #endif
  149.     __s32        max_addresses;
  150.     __s32        accept_ra_defrtr;
  151.     __s32        accept_ra_pinfo;
  152. #ifdef CONFIG_IPV6_ROUTER_PREF
  153.     __s32        accept_ra_rtr_pref;
  154.     __s32        rtr_probe_interval;
  155. #ifdef CONFIG_IPV6_ROUTE_INFO
  156.     __s32        accept_ra_rt_info_max_plen;
  157. #endif
  158. #endif
  159.     __s32        proxy_ndp;
  160.     __s32        accept_source_route;
  161. #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
  162.     __s32        optimistic_dad;
  163. #endif
  164. #ifdef CONFIG_IPV6_MROUTE
  165.     __s32        mc_forwarding;
  166. #endif
  167.     __s32        disable_ipv6;
  168.     __s32        accept_dad;
  169.     void        *sysctl;
  170. };
  171. #endif
  172.  
  173. /* index values for the variables in ipv6_devconf */
  174. enum {
  175.     DEVCONF_FORWARDING = 0,
  176.     DEVCONF_HOPLIMIT,
  177.     DEVCONF_MTU6,
  178.     DEVCONF_ACCEPT_RA,
  179.     DEVCONF_ACCEPT_REDIRECTS,
  180.     DEVCONF_AUTOCONF,
  181.     DEVCONF_DAD_TRANSMITS,
  182.     DEVCONF_RTR_SOLICITS,
  183.     DEVCONF_RTR_SOLICIT_INTERVAL,
  184.     DEVCONF_RTR_SOLICIT_DELAY,
  185.     DEVCONF_USE_TEMPADDR,
  186.     DEVCONF_TEMP_VALID_LFT,
  187.     DEVCONF_TEMP_PREFERED_LFT,
  188.     DEVCONF_REGEN_MAX_RETRY,
  189.     DEVCONF_MAX_DESYNC_FACTOR,
  190.     DEVCONF_MAX_ADDRESSES,
  191.     DEVCONF_FORCE_MLD_VERSION,
  192.     DEVCONF_ACCEPT_RA_DEFRTR,
  193.     DEVCONF_ACCEPT_RA_PINFO,
  194.     DEVCONF_ACCEPT_RA_RTR_PREF,
  195.     DEVCONF_RTR_PROBE_INTERVAL,
  196.     DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN,
  197.     DEVCONF_PROXY_NDP,
  198.     DEVCONF_OPTIMISTIC_DAD,
  199.     DEVCONF_ACCEPT_SOURCE_ROUTE,
  200.     DEVCONF_MC_FORWARDING,
  201.     DEVCONF_DISABLE_IPV6,
  202.     DEVCONF_ACCEPT_DAD,
  203.     DEVCONF_MAX
  204. };
  205.  
  206. #ifdef __KERNEL__
  207. #include <linux/icmpv6.h>
  208. #include <linux/tcp.h>
  209. #include <linux/udp.h>
  210.  
  211. #include <net/inet_sock.h>
  212.  
  213. static inline struct ipv6hdr *ipv6_hdr(const struct sk_buff *skb)
  214. {
  215.     return (struct ipv6hdr *)skb_network_header(skb);
  216. }
  217.  
  218. static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)
  219. {
  220.     return (struct ipv6hdr *)skb_transport_header(skb);
  221. }
  222.  
  223. /* 
  224.    This structure contains results of exthdrs parsing
  225.    as offsets from skb->nh.
  226.  */
  227.  
  228. struct inet6_skb_parm {
  229.     int            iif;
  230.     __u16            ra;
  231.     __u16            hop;
  232.     __u16            dst0;
  233.     __u16            srcrt;
  234.     __u16            dst1;
  235.     __u16            lastopt;
  236.     __u32            nhoff;
  237.     __u16            flags;
  238. #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
  239.     __u16            dsthao;
  240. #endif
  241.  
  242. #define IP6SKB_XFRM_TRANSFORMED    1
  243. #define IP6SKB_FORWARDED    2
  244. };
  245.  
  246. #define IP6CB(skb)    ((struct inet6_skb_parm*)((skb)->cb))
  247.  
  248. static inline int inet6_iif(const struct sk_buff *skb)
  249. {
  250.     return IP6CB(skb)->iif;
  251. }
  252.  
  253. struct inet6_request_sock {
  254.     struct in6_addr        loc_addr;
  255.     struct in6_addr        rmt_addr;
  256.     struct sk_buff        *pktopts;
  257.     int            iif;
  258. };
  259.  
  260. struct tcp6_request_sock {
  261.     struct tcp_request_sock      tcp6rsk_tcp;
  262.     struct inet6_request_sock tcp6rsk_inet6;
  263. };
  264.  
  265. struct ipv6_mc_socklist;
  266. struct ipv6_ac_socklist;
  267. struct ipv6_fl_socklist;
  268.  
  269. /**
  270.  * struct ipv6_pinfo - ipv6 private area
  271.  *
  272.  * In the struct sock hierarchy (tcp6_sock, upd6_sock, etc)
  273.  * this _must_ be the last member, so that inet6_sk_generic
  274.  * is able to calculate its offset from the base struct sock
  275.  * by using the struct proto->slab_obj_size member. -acme
  276.  */
  277. struct ipv6_pinfo {
  278.     struct in6_addr     saddr;
  279.     struct in6_addr     rcv_saddr;
  280.     struct in6_addr        daddr;
  281.     struct in6_addr        *daddr_cache;
  282. #ifdef CONFIG_IPV6_SUBTREES
  283.     struct in6_addr        *saddr_cache;
  284. #endif
  285.  
  286.     __be32            flow_label;
  287.     __u32            frag_size;
  288.  
  289.     /*
  290.      * Packed in 16bits.
  291.      * Omit one shift by by putting the signed field at MSB.
  292.      */
  293. #if defined(__BIG_ENDIAN_BITFIELD)
  294.     __s16            hop_limit:9;
  295.     __u16            __unused_1:7;
  296. #else
  297.     __u16            __unused_1:7;
  298.     __s16            hop_limit:9;
  299. #endif
  300.  
  301. #if defined(__BIG_ENDIAN_BITFIELD)
  302.     /* Packed in 16bits. */
  303.     __s16            mcast_hops:9;
  304.     __u16            __unused_2:6,
  305.                 mc_loop:1;
  306. #else
  307.     __u16            mc_loop:1,
  308.                 __unused_2:6;
  309.     __s16            mcast_hops:9;
  310. #endif
  311.     int            mcast_oif;
  312.  
  313.     /* pktoption flags */
  314.     union {
  315.         struct {
  316.             __u16    srcrt:1,
  317.                 osrcrt:1,
  318.                     rxinfo:1,
  319.                     rxoinfo:1,
  320.                 rxhlim:1,
  321.                 rxohlim:1,
  322.                 hopopts:1,
  323.                 ohopopts:1,
  324.                 dstopts:1,
  325.                 odstopts:1,
  326.                                 rxflow:1,
  327.                 rxtclass:1;
  328.         } bits;
  329.         __u16        all;
  330.     } rxopt;
  331.  
  332.     /* sockopt flags */
  333.     __u8            recverr:1,
  334.                             sndflow:1,
  335.                 pmtudisc:2,
  336.                 ipv6only:1,
  337.                 srcprefs:3;    /* 001: prefer temporary address
  338.                          * 010: prefer public address
  339.                          * 100: prefer care-of address
  340.                          */
  341.     __u8            tclass;
  342.  
  343.     __u32            dst_cookie;
  344.  
  345.     struct ipv6_mc_socklist    *ipv6_mc_list;
  346.     struct ipv6_ac_socklist    *ipv6_ac_list;
  347.     struct ipv6_fl_socklist *ipv6_fl_list;
  348.  
  349.     struct ipv6_txoptions    *opt;
  350.     struct sk_buff        *pktoptions;
  351.     struct {
  352.         struct ipv6_txoptions *opt;
  353.         u8 hop_limit;
  354.         u8 tclass;
  355.     } cork;
  356. };
  357.  
  358. /* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */
  359. struct raw6_sock {
  360.     /* inet_sock has to be the first member of raw6_sock */
  361.     struct inet_sock    inet;
  362.     __u32            checksum;    /* perform checksum */
  363.     __u32            offset;        /* checksum offset  */
  364.     struct icmp6_filter    filter;
  365.     /* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */
  366.     struct ipv6_pinfo    inet6;
  367. };
  368.  
  369. struct udp6_sock {
  370.     struct udp_sock      udp;
  371.     /* ipv6_pinfo has to be the last member of udp6_sock, see inet6_sk_generic */
  372.     struct ipv6_pinfo inet6;
  373. };
  374.  
  375. struct tcp6_sock {
  376.     struct tcp_sock      tcp;
  377.     /* ipv6_pinfo has to be the last member of tcp6_sock, see inet6_sk_generic */
  378.     struct ipv6_pinfo inet6;
  379. };
  380.  
  381. extern int inet6_sk_rebuild_header(struct sock *sk);
  382.  
  383. #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
  384. static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
  385. {
  386.     return inet_sk(__sk)->pinet6;
  387. }
  388.  
  389. static inline struct inet6_request_sock *
  390.             inet6_rsk(const struct request_sock *rsk)
  391. {
  392.     return (struct inet6_request_sock *)(((u8 *)rsk) +
  393.                          inet_rsk(rsk)->inet6_rsk_offset);
  394. }
  395.  
  396. static inline u32 inet6_rsk_offset(struct request_sock *rsk)
  397. {
  398.     return rsk->rsk_ops->obj_size - sizeof(struct inet6_request_sock);
  399. }
  400.  
  401. static inline struct request_sock *inet6_reqsk_alloc(struct request_sock_ops *ops)
  402. {
  403.     struct request_sock *req = reqsk_alloc(ops);
  404.  
  405.     if (req != NULL) {
  406.         inet_rsk(req)->inet6_rsk_offset = inet6_rsk_offset(req);
  407.         inet6_rsk(req)->pktopts = NULL;
  408.     }
  409.  
  410.     return req;
  411. }
  412.  
  413. static inline struct raw6_sock *raw6_sk(const struct sock *sk)
  414. {
  415.     return (struct raw6_sock *)sk;
  416. }
  417.  
  418. static inline void inet_sk_copy_descendant(struct sock *sk_to,
  419.                        const struct sock *sk_from)
  420. {
  421.     int ancestor_size = sizeof(struct inet_sock);
  422.  
  423.     if (sk_from->sk_family == PF_INET6)
  424.         ancestor_size += sizeof(struct ipv6_pinfo);
  425.  
  426.     __inet_sk_copy_descendant(sk_to, sk_from, ancestor_size);
  427. }
  428.  
  429. #define __ipv6_only_sock(sk)    (inet6_sk(sk)->ipv6only)
  430. #define ipv6_only_sock(sk)    ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
  431.  
  432. struct inet6_timewait_sock {
  433.     struct in6_addr tw_v6_daddr;
  434.     struct in6_addr    tw_v6_rcv_saddr;
  435. };
  436.  
  437. struct tcp6_timewait_sock {
  438.     struct tcp_timewait_sock   tcp6tw_tcp;
  439.     struct inet6_timewait_sock tcp6tw_inet6;
  440. };
  441.  
  442. static inline u16 inet6_tw_offset(const struct proto *prot)
  443. {
  444.     return prot->twsk_prot->twsk_obj_size -
  445.             sizeof(struct inet6_timewait_sock);
  446. }
  447.  
  448. static inline struct inet6_timewait_sock *inet6_twsk(const struct sock *sk)
  449. {
  450.     return (struct inet6_timewait_sock *)(((u8 *)sk) +
  451.                           inet_twsk(sk)->tw_ipv6_offset);
  452. }
  453.  
  454. static inline struct in6_addr *__inet6_rcv_saddr(const struct sock *sk)
  455. {
  456.     return likely(sk->sk_state != TCP_TIME_WAIT) ?
  457.         &inet6_sk(sk)->rcv_saddr : &inet6_twsk(sk)->tw_v6_rcv_saddr;
  458. }
  459.  
  460. static inline struct in6_addr *inet6_rcv_saddr(const struct sock *sk)
  461. {
  462.     return sk->sk_family == AF_INET6 ? __inet6_rcv_saddr(sk) : NULL;
  463. }
  464.  
  465. static inline int inet_v6_ipv6only(const struct sock *sk)
  466. {
  467.     return likely(sk->sk_state != TCP_TIME_WAIT) ?
  468.         ipv6_only_sock(sk) : inet_twsk(sk)->tw_ipv6only;
  469. }
  470. #else
  471. #define __ipv6_only_sock(sk)    0
  472. #define ipv6_only_sock(sk)    0
  473.  
  474. static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
  475. {
  476.     return NULL;
  477. }
  478.  
  479. static inline struct inet6_request_sock *
  480.             inet6_rsk(const struct request_sock *rsk)
  481. {
  482.     return NULL;
  483. }
  484.  
  485. static inline struct raw6_sock *raw6_sk(const struct sock *sk)
  486. {
  487.     return NULL;
  488. }
  489.  
  490. #define __inet6_rcv_saddr(__sk)    NULL
  491. #define inet6_rcv_saddr(__sk)    NULL
  492. #define tcp_twsk_ipv6only(__sk)        0
  493. #define inet_v6_ipv6only(__sk)        0
  494. #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
  495.  
  496. #define INET6_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif)\
  497.     (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)    && \
  498.      ((*((__portpair *)&(inet_sk(__sk)->dport))) == (__ports))      && \
  499.      ((__sk)->sk_family        == AF_INET6)        && \
  500.      ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr))    && \
  501.      ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr))    && \
  502.      (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
  503.  
  504. #define INET6_TW_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif) \
  505.     (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)    && \
  506.      (*((__portpair *)&(inet_twsk(__sk)->tw_dport)) == (__ports))    && \
  507.      ((__sk)->sk_family           == PF_INET6)            && \
  508.      (ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr)))    && \
  509.      (ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_rcv_saddr, (__daddr))) && \
  510.      (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
  511.  
  512. #endif /* __KERNEL__ */
  513.  
  514. #endif /* _IPV6_H */
  515.